﻿// --------------------------------------------------------------------------------------------------------------------
// <copyright file="RepositoryBase.cs" company="BS - Desenvolvemento">
//   Desenvolvimento de solucoes tecnologicas para automacao em geral
// </copyright>
// <summary>
//   A classe de repositorio base.
// </summary>
// --------------------------------------------------------------------------------------------------------------------

namespace ProjetoModeloDDD.Infra.Data.Repositories
{
    using ProjetoModeloDDD.Domain.Interfaces.Repositories;
    using ProjetoModeloDDD.Infra.Data.Contexto;
    using System;
    using System.Collections.Generic;
    using System.Data.Entity;
    using System.Linq;

    /// <summary>
    /// A classe de repositorio base.
    /// </summary>
    /// <typeparam name="TEntity">
    /// Implementa uma entidade generica do tipo class.
    /// </typeparam>
    public class RepositoryBase<TEntity> : IDisposable, IRepositoryBase<TEntity> where TEntity : class
    {
        /// <summary>
        /// Intancia do contexto db.
        /// </summary>
        protected ProjetoModeloContext Db = new ProjetoModeloContext();

        /// <summary>
        /// Metodo add.
        /// </summary>
        /// <param name="obj">
        /// O objeto a ser adicionado.
        /// </param>
        public void Add(TEntity obj)
        {
            this.Db.Set<TEntity>().Add(obj);
            this.Db.SaveChanges();
        }

        /// <summary>
        /// O metodo dispose.
        /// </summary>
        public void Dispose()
        {
        }

        /// <summary>
        /// Metodo que retorna um objeto atraves da consulta por id.
        /// </summary>
        /// <returns>
        /// Retorna o objeto consultado.
        /// </returns>
        public IEnumerable<TEntity> GetAll()
        {
            return this.Db.Set<TEntity>().ToList();
        }

        /// <summary>
        /// Metodo que remove o objeto do repositorio.
        /// </summary>
        /// <param name="id">
        /// O id do objeto a ser removidp.
        /// </param>
        /// <returns>
        /// O objeto a ser removido.
        /// </returns>
        public TEntity GetbyId(int id)
        {
            return this.Db.Set<TEntity>().Find(id);
        }

        /// <summary>
        /// Metodo dispose.
        /// </summary>
        void IDisposable.Dispose()
        {
        }

        /// <summary>
        /// Metodo que remove o objeto do repositorio.
        /// </summary>
        /// <param name="obj">
        /// O objeto a ser removido.
        /// </param>
        public void Remove(TEntity obj)
        {
            this.Db.Set<TEntity>().Remove(obj);
            this.Db.SaveChanges();
        }

        /// <summary>
        /// Metodo para atualizar um objeto.
        /// </summary>
        /// <param name="obj">
        /// O objeto a ser atualizado.
        /// </param>
        public void Update(TEntity obj)
        {
            this.Db.Entry(obj).State = EntityState.Modified;
            this.Db.SaveChanges();
        }
    }
}